<?php

// 发立得信息发布系统房屋信息版(php+mysql) V1.0
// 演示地址: http://fang.chalide.cn
// 文件路径: sys/info.php
// 文件大小: 25423 字节
// 最后修改时间: 2025-05-23 20:14:17
// 作者: yujianyue
// 邮件: 15058593138@qq.com
// 版权所有,保留发行权和署名权
/**
 * 本文件功能：信息管理
 * 版权声明：保留发行权和署名权
 * 作者信息：15058593138@qq.com
 */

// 获取当前用户
$curr_user = check_login(USER_TYPE_ADMIN);
$db = DB::getInstance();

// 处理AJAX请求
if (isset($_GET['act'])) {
    $act = $_GET['act'];
    
    switch ($act) {
        // 获取信息列表
        case 'list':
            $page = isset($_POST['page']) ? intval($_POST['page']) : 1;
            $limit = 10;
            
            // 构建查询条件
            $where = '1=1';
            
            if (!empty($_POST['keyword'])) {
                $keyword = $db->escape($_POST['keyword']);
                $where .= " AND (title LIKE '%$keyword%' OR `desc` LIKE '%$keyword%' OR `keys` LIKE '%$keyword%' OR cname LIKE '%$keyword%' OR cmobi LIKE '%$keyword%')";
            }
            
            if (isset($_POST['type1']) && $_POST['type1'] !== '') {
                $type1 = intval($_POST['type1']);
                $where .= " AND type1 = $type1";
            }
            
            if (isset($_POST['type2']) && $_POST['type2'] !== '') {
                $type2 = intval($_POST['type2']);
                $where .= " AND type2 = $type2";
            }
            
            if (isset($_POST['open1']) && $_POST['open1'] !== '') {
                $open1 = intval($_POST['open1']);
                $where .= " AND open1 = $open1";
            }
            
            // 查询总数
            $total = $db->count('info', $where);
            
            // 分页参数
            $pagination = get_pagination($total, $page, $limit);
            
            // 查询列表
            $sql = "SELECT i.*, u.user 
                    FROM info i 
                    LEFT JOIN user u ON i.user_id = u.id 
                    WHERE $where 
                    ORDER BY i.id DESC 
                    LIMIT {$pagination['offset']}, {$pagination['limit']}";
            
            $list = $db->getAll($sql);
            
            // 处理列表数据
            foreach ($list as &$item) {
                // 处理时间格式
                $item['add_time'] = format_datetime($item['add_time'], 'Y-m-d H:i:s');
                $item['gai_time'] = format_datetime($item['gai_time'], 'Y-m-d H:i:s');
                
                // 获取第一张图片
                $img_sql = "SELECT path FROM imgs WHERE info_id = {$item['id']} ORDER BY sort ASC, id ASC LIMIT 1";
                $img = $db->getOne($img_sql);
                $item['img'] = $img ? $img : 'imgs/default.jpg';
                
                // 加载类型文本
                $type1_json = file_get_contents('./inc/type1.json');
                $type2_json = file_get_contents('./inc/type2.json');
                $type1_arr = json_decode($type1_json, true);
                $type2_arr = json_decode($type2_json, true);
                
                $item['type1_text'] = isset($type1_arr[$item['type1']]) ? $type1_arr[$item['type1']] : '';
                $item['type2_text'] = isset($type2_arr[$item['type2']]) ? $type2_arr[$item['type2']] : '';
                
                // 生成查看详情token
                $item['token'] = md5($item['id'] . 'info_detail');
            }
            
            // 返回数据
            json_msg(1, '获取成功', [
                'list' => $list,
                'page' => $pagination['page'],
                'total_page' => $pagination['total_page'],
                'total' => $pagination['total']
            ]);
            break;
            
        // 修改状态
        case 'status':
            if (empty($_POST['id'])) {
                json_msg(0, '参数错误');
            }
            
            $id = intval($_POST['id']);
            
            // 检查信息是否存在
            $sql = "SELECT id, open1 FROM info WHERE id = $id";
            $info = $db->getRow($sql);
            
            if (!$info) {
                json_msg(0, '信息不存在');
            }
            
            // 切换状态
            $status = $info['open1'] == 1 ? 0 : 1;
            $result = $db->update('info', ['open1' => $status], "id = $id");
            
            if ($result) {
                json_msg(1, '操作成功');
            } else {
                json_msg(0, '操作失败，请稍后重试');
            }
            break;
            
        // 批量操作
        case 'batch':
            if (empty($_POST['ids']) || empty($_POST['action'])) {
                json_msg(0, '参数错误');
            }
            
            $ids = $_POST['ids'];
            $action = $_POST['action'];
            
            // 处理IDs
            if (is_array($ids)) {
                // 如果是数组格式
                $id_str = implode(',', array_map('intval', $ids));
            } else {
                // 如果是字符串格式（逗号分隔）
                $id_arr = explode(',', $ids);
                $id_str = implode(',', array_map('intval', $id_arr));
            }
            
            // 验证处理后的ID字符串
            if (empty($id_str)) {
                json_msg(0, '请选择要操作的信息');
            }
            
            // 执行操作
            switch ($action) {
                case 'delete':
                    // 开始事务
                    $db->beginTransaction();
                    
                    // 删除图片
                    $db->delete('imgs', "info_id IN ($id_str)");
                    
                    // 删除信息
                    $result = $db->delete('info', "id IN ($id_str)");
                    
                    if ($result) {
                        $db->commit();
                        json_msg(1, '删除成功');
                    } else {
                        $db->rollback();
                        json_msg(0, '删除失败，请稍后重试');
                    }
                    break;
                    
                case 'show':
                    $result = $db->update('info', ['open1' => 1], "id IN ($id_str)");
                    
                    if ($result) {
                        json_msg(1, '上架成功');
                    } else {
                        json_msg(0, '上架失败，请稍后重试');
                    }
                    break;
                    
                case 'hide':
                    $result = $db->update('info', ['open1' => 0], "id IN ($id_str)");
                    
                    if ($result) {
                        json_msg(1, '下架成功');
                    } else {
                        json_msg(0, '下架失败，请稍后重试');
                    }
                    break;
                    
                default:
                    json_msg(0, '未知操作');
            }
            break;
            
        // 获取信息详情
        case 'detail':
            if (empty($_POST['id'])) {
                json_msg(0, '参数错误');
            }
            
            $id = intval($_POST['id']);
            
            // 查询详情
            $sql = "SELECT i.*, u.user FROM info i 
                    LEFT JOIN user u ON i.user_id = u.id 
                    WHERE i.id = $id";
            
            $info = $db->getRow($sql);
            
            if (!$info) {
                json_msg(0, '信息不存在');
            }
            
            // 处理时间格式
            $info['add_time'] = format_datetime($info['add_time'], 'Y-m-d H:i:s');
            $info['gai_time'] = format_datetime($info['gai_time'], 'Y-m-d H:i:s');
            
            // 获取图片
            $img_sql = "SELECT id, path FROM imgs WHERE info_id = {$info['id']} ORDER BY sort ASC, id ASC";
            $info['imgs'] = $db->getAll($img_sql);
            
            // 加载类型文本
            $type1_json = file_get_contents('./inc/type1.json');
            $type2_json = file_get_contents('./inc/type2.json');
            $type1_arr = json_decode($type1_json, true);
            $type2_arr = json_decode($type2_json, true);
            
            $info['type1_text'] = isset($type1_arr[$info['type1']]) ? $type1_arr[$info['type1']] : '';
            $info['type2_text'] = isset($type2_arr[$info['type2']]) ? $type2_arr[$info['type2']] : '';
            
            // 处理关键词
            $info['keys_arr'] = $info['keys'] ? explode(',', $info['keys']) : [];
            
            json_msg(1, '获取成功', $info);
            break;
            
        default:
            json_msg(0, '未知操作');
    }
    
    exit;
}
    include './inc/head.php';
?>

<div class="info-container" style="background:#fff;padding:20px;border-radius:5px;box-shadow:0 1px 3px rgba(0,0,0,0.1);">
    <div class="top-bar">
        <div class="title" style="display:flex;justify-content:space-between;align-items:center;">
            <h2 style="margin:0;">信息管理</h2>
            <div>
                <button type="button" id="batch-delete-btn" class="btn btn-danger">批量删除</button>
                <button type="button" id="batch-show-btn" class="btn btn-success">批量上架</button>
                <button type="button" id="batch-hide-btn" class="btn btn-warning">批量下架</button>
            </div>
        </div>
        
        <div class="search-bar" style="margin-top:15px;display:flex;flex-wrap:wrap;">
            <div class="search-item" style="margin-right:10px;margin-bottom:10px;">
                <select id="type1" class="form-control">
                    <option value="">所有信息类型</option>
                    <?php
                    // 获取信息类型
                    $type1_file = './inc/type1.json';
                    if (file_exists($type1_file)) {
                        $type1_json = file_get_contents($type1_file);
                        $type1_arr = json_decode($type1_json, true);
                        foreach ($type1_arr as $code => $name) {
                            echo "<option value=\"$code\">$name</option>";
                        }
                    }
                    ?>
                </select>
            </div>
            
            <div class="search-item" style="margin-right:10px;margin-bottom:10px;">
                <select id="type2" class="form-control">
                    <option value="">所有交易类型</option>
                    <?php
                    // 获取交易类型
                    $type2_file = './inc/type2.json';
                    if (file_exists($type2_file)) {
                        $type2_json = file_get_contents($type2_file);
                        $type2_arr = json_decode($type2_json, true);
                        foreach ($type2_arr as $code => $name) {
                            echo "<option value=\"$code\">$name</option>";
                        }
                    }
                    ?>
                </select>
            </div>
            
            <div class="search-item" style="margin-right:10px;margin-bottom:10px;">
                <select id="open1" class="form-control">
                    <option value="">所有状态</option>
                    <option value="1">上架中</option>
                    <option value="0">已下架</option>
                </select>
            </div>
            
            <div class="search-item" style="margin-right:10px;margin-bottom:10px;flex:1;">
                <input type="text" id="keyword" class="form-control" placeholder="标题/描述/关键词/联系人/电话">
            </div>
            
            <div class="search-item" style="margin-bottom:10px;">
                <button type="button" id="search-btn" class="btn btn-primary">搜索</button>
            </div>
        </div>
    </div>
    
    <div id="info-list" style="margin-top:20px;"></div>
    <div id="pagination"></div>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    // 加载信息列表
    loadInfoList();
    
    // 搜索按钮点击事件
    document.getElementById('search-btn').addEventListener('click', function() {
        loadInfoList();
    });
    
    // 回车搜索
    document.getElementById('keyword').addEventListener('keydown', function(e) {
        if (e.keyCode === 13) {
            loadInfoList();
        }
    });
    
    // 批量删除按钮点击事件
    document.getElementById('batch-delete-btn').addEventListener('click', function() {
        batchOperation('delete', '确定要删除选中的信息吗？');
    });
    
    // 批量上架按钮点击事件
    document.getElementById('batch-show-btn').addEventListener('click', function() {
        batchOperation('show', '确定要上架选中的信息吗？');
    });
    
    // 批量下架按钮点击事件
    document.getElementById('batch-hide-btn').addEventListener('click', function() {
        batchOperation('hide', '确定要下架选中的信息吗？');
    });
});

// 加载信息列表
function loadInfoList(page) {
    page = page || 1;
    
    // 获取搜索参数
    const type1 = document.getElementById('type1').value;
    const type2 = document.getElementById('type2').value;
    const open1 = document.getElementById('open1').value;
    const keyword = document.getElementById('keyword').value;
    
    // 显示加载中
    document.getElementById('info-list').innerHTML = '<div style="text-align:center;padding:20px;">加载中...</div>';
    
    // 请求数据
    ajax({
        url: 'sys.php?do=info&act=list',
        method: 'POST',
        data: {
            page: page,
            type1: type1,
            type2: type2,
            open1: open1,
            keyword: keyword
        },
        success: function(res) {
            if (res.code === 1) {
                // 渲染列表
                renderInfoList(res.data.list);
                
                // 渲染分页
                document.getElementById('pagination').innerHTML = renderPagination(res.data.page, res.data.total_page);
                
                // 绑定分页事件
                bindPaginationEvents(function(page) {
                    loadInfoList(page);
                });
                
                // 绑定操作事件
                bindInfoOperationEvents();
            } else {
                document.getElementById('info-list').innerHTML = '<div style="text-align:center;padding:20px;">暂无数据</div>';
                document.getElementById('pagination').innerHTML = '';
                showToast(res.msg);
            }
        },
        error: function() {
            document.getElementById('info-list').innerHTML = '<div style="text-align:center;padding:20px;">加载失败，请刷新重试</div>';
            document.getElementById('pagination').innerHTML = '';
            showToast('网络错误，请稍后重试');
        }
    });
}

// 渲染信息列表
function renderInfoList(list) {
    if (!list || list.length === 0) {
        document.getElementById('info-list').innerHTML = '<div style="text-align:center;padding:20px;">暂无数据</div>';
        return;
    }
    
    let html = '<table class="table">';
    html += '<tr>';
    html += '<th width="5%"><input type="checkbox" id="check-all"></th>';
    html += '<th width="5%">ID</th>';
    html += '<th width="20%">标题</th>';
    html += '<th width="10%">类型</th>';
    html += '<th width="10%">价格/面积</th>';
    html += '<th width="10%">发布者</th>';
    html += '<th width="15%">发布时间</th>';
    html += '<th width="10%">状态</th>';
    html += '<th width="15%">操作</th>';
    html += '</tr>';
    
    for (let i = 0; i < list.length; i++) {
        const item = list[i];
        html += '<tr>';
        html += '<td><input type="checkbox" class="check-item" value="' + item.id + '"></td>';
        html += '<td>' + item.id + '</td>';
        html += '<td>' + item.title + '</td>';
        html += '<td>' + item.type1_text + '/' + item.type2_text + '</td>';
        html += '<td>' + item.jiage + '元' + (item.area ? '/' + item.area + '㎡' : '') + '</td>';
        html += '<td>' + (item.user || '未知') + '</td>';
        html += '<td>' + item.gai_time + '</td>';
        html += '<td>' + (item.open1 == 1 ? '<span style="color:green;">上架中</span>' : '<span style="color:red;">已下架</span>') + '</td>';
        html += '<td>';
        html += '<a href="javascript:;" class="btn-detail" data-id="' + item.id + '" style="margin-right:5px;">详情</a>';
        html += '<a href="javascript:;" class="btn-status" data-id="' + item.id + '" style="margin-right:5px;">' + (item.open1 == 1 ? '下架' : '上架') + '</a>';
        html += '<a href="javascript:;" class="btn-delete" data-id="' + item.id + '">删除</a>';
        html += '</td>';
        html += '</tr>';
    }
    
    html += '</table>';
    
    document.getElementById('info-list').innerHTML = html;
    
    // 全选/取消全选
    const checkAll = document.getElementById('check-all');
    checkAll.addEventListener('change', function() {
        const checkItems = document.querySelectorAll('.check-item');
        for (let i = 0; i < checkItems.length; i++) {
            checkItems[i].checked = this.checked;
        }
    });
}

// 绑定信息操作事件
function bindInfoOperationEvents() {
    // 详情按钮
    const detailBtns = document.querySelectorAll('.btn-detail');
    for (let i = 0; i < detailBtns.length; i++) {
        detailBtns[i].addEventListener('click', function() {
            const id = this.getAttribute('data-id');
            showInfoDetail(id);
        });
    }
    
    // 状态切换按钮
    const statusBtns = document.querySelectorAll('.btn-status');
    for (let i = 0; i < statusBtns.length; i++) {
        statusBtns[i].addEventListener('click', function() {
            const id = this.getAttribute('data-id');
            
            // 切换状态
            ajax({
                url: 'sys.php?do=info&act=status',
                method: 'POST',
                data: { id: id },
                success: function(res) {
                    showToast(res.msg);
                    if (res.code === 1) {
                        // 重新加载列表
                        loadInfoList(document.querySelector('.pagination .current') ? 
                            parseInt(document.querySelector('.pagination .current').textContent) : 1);
                    }
                },
                error: function() {
                    showToast('网络错误，请稍后重试');
                }
            });
        });
    }
    
    // 删除按钮
    const deleteBtns = document.querySelectorAll('.btn-delete');
    for (let i = 0; i < deleteBtns.length; i++) {
        deleteBtns[i].addEventListener('click', function() {
            const id = this.getAttribute('data-id');
            
            // 确认删除
            confirm('确定要删除该信息吗？', function() {
                // 执行批量操作
                executeBatchOperation('delete', [id]);
            });
        });
    }
}

// 批量操作
function batchOperation(action, confirmMsg) {
    // 获取选中的ID
    const checkItems = document.querySelectorAll('.check-item:checked');
    const ids = [];
    
    for (let i = 0; i < checkItems.length; i++) {
        ids.push(checkItems[i].value);
    }
    
    if (ids.length === 0) {
        showToast('请选择要操作的信息');
        return;
    }
    
    // 确认操作
    showModal('确认操作', confirmMsg, [
        {
            text: '取消',
            class: 'btn btn-cancel',
            onClick: function() {
                const mask = document.querySelector('.mask');
                if (mask) {
                    document.body.removeChild(mask);
                }
            }
        },
        {
            text: '确定',
            class: 'btn btn-primary',
            onClick: function() {
                // 关闭模态框
                const mask = document.querySelector('.mask');
                if (mask) {
                    document.body.removeChild(mask);
                }
                // 执行批量操作
                executeBatchOperation(action, ids);
            }
        }
    ]);
}

// 执行批量操作
function executeBatchOperation(action, ids) {
    // 将ids数组转换为字符串
    var idsStr = ids.join(',');
    
    ajax({
        url: 'sys.php?do=info&act=batch',
        method: 'POST',
        data: {
            action: action,
            ids: idsStr
        },
        success: function(res) {
            showToast(res.msg);
            if (res.code === 1) {
                // 重新加载列表
                loadInfoList(document.querySelector('.pagination .current') ? 
                    parseInt(document.querySelector('.pagination .current').textContent) : 1);
            }
        },
        error: function() {
            showToast('网络错误，请稍后重试');
        }
    });
}

// 显示信息详情
function showInfoDetail(id) {
    // 显示加载中
    showModal('信息详情', '<div style="text-align:center;padding:20px;">加载中...</div>', [
        {
            text: '关闭',
            class: 'btn btn-primary',
            onClick: function() {
                const mask = document.querySelector('.mask');
                if (mask) {
                    document.body.removeChild(mask);
                }
            }
        }
    ]);
    
    // 请求详情
    ajax({
        url: 'sys.php?do=info&act=detail',
        method: 'POST',
        data: { id: id },
        success: function(res) {
            if (res.code === 1) {
                // 渲染详情
                renderInfoDetail(res.data);
            } else {
                showToast(res.msg);
            }
        },
        error: function() {
            showToast('网络错误，请稍后重试');
        }
    });
}

// 渲染信息详情
function renderInfoDetail(info) {
    let html = '<div class="info-detail">';
    
    // 标题
    html += '<h2 style="margin-bottom:15px;text-align:center;">' + info.title + '</h2>';
    
    // 图片
    if (info.imgs && info.imgs.length > 0) {
        html += '<div class="info-images" style="margin-bottom:15px;text-align:center;">';
        for (let i = 0; i < info.imgs.length; i++) {
            html += '<img src="' + info.imgs[i].path + '" style="max-width:100%;max-height:300px;margin:5px;">';
        }
        html += '</div>';
    }
    
    // 基本信息
    html += '<div class="info-base" style="margin-bottom:15px;padding:10px;background:#f5f5f5;border-radius:4px;">';
    html += '<p><strong>ID：</strong>' + info.id + '</p>';
    html += '<p><strong>发布者：</strong>' + (info.user || '未知') + ' (ID: ' + info.user_id + ')</p>';
    html += '<p><strong>信息类型：</strong>' + info.type1_text + '</p>';
    html += '<p><strong>交易类型：</strong>' + info.type2_text + '</p>';
    html += '<p><strong>价格：</strong>' + info.jiage + '元</p>';
    if (info.area) {
        html += '<p><strong>面积：</strong>' + info.area + '㎡</p>';
    }
    if (info.addr) {
        html += '<p><strong>位置：</strong>' + info.addr + '</p>';
    }
    html += '<p><strong>状态：</strong>' + (info.open1 == 1 ? '<span style="color:green;">上架中(管理员)</span>' : '<span style="color:red;">已下架(管理员)</span>') + ' / ' + 
            (info.open2 == 1 ? '<span style="color:green;">上架中(用户)</span>' : '<span style="color:red;">已下架(用户)</span>') + '</p>';
    html += '<p><strong>浏览次数：</strong>' + info.view + '</p>';
    html += '<p><strong>发布时间：</strong>' + info.add_time + '</p>';
    html += '<p><strong>更新时间：</strong>' + info.gai_time + '</p>';
    html += '</div>';
    
    // 详细描述
    if (info.desc) {
        html += '<div class="info-desc" style="margin-bottom:15px;">';
        html += '<h3>详细描述</h3>';
        html += '<div style="padding:10px;background:#f9f9f9;border-radius:4px;">' + info.desc.replace(/\n/g, '<br>') + '</div>';
        html += '</div>';
    }
    
    // 关键词
    if (info.keys_arr && info.keys_arr.length > 0) {
        html += '<div class="info-keys" style="margin-bottom:15px;">';
        html += '<h3>关键词</h3>';
        html += '<div style="padding:10px;background:#f9f9f9;border-radius:4px;">';
        for (let i = 0; i < info.keys_arr.length; i++) {
            html += '<span style="display:inline-block;margin:2px 5px;padding:2px 8px;background:#e1e1e1;border-radius:3px;">' + info.keys_arr[i] + '</span>';
        }
        html += '</div></div>';
    }
    
    // 联系方式
    html += '<div class="info-contact" style="margin-bottom:15px;">';
    html += '<h3>联系方式</h3>';
    html += '<div style="padding:10px;background:#f9f9f9;border-radius:4px;">';
    html += '<p><strong>联系人：</strong>' + info.cname + '</p>';
    html += '<p><strong>联系电话：</strong>' + info.cmobi + '</p>';
    html += '</div></div>';
    
    html += '</div>';
    
    // 更新模态框内容
    const modalBody = document.querySelector('.modal-body');
    if (modalBody) {
        modalBody.innerHTML = html;
    }
}
</script>
